package org.reveno.atp.clustering.test.common; import com.google.common.io.Files; import org.reveno.atp.clustering.api.Address; import org.reveno.atp.clustering.api.IOMode; import org.reveno.atp.clustering.api.InetAddress; import org.reveno.atp.clustering.api.SyncMode; import org.reveno.atp.clustering.core.buffer.ClusterProvider; import org.reveno.atp.clustering.util.Utils; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; public abstract class ClusterTestUtils { public static List<ClusterEngineWrapper> createClusterEngines(int count, Supplier<ClusterProvider> provider) { return createClusterEngines(count, randomFiles(count), e -> {}, provider); } public static List<ClusterEngineWrapper> createClusterEngines(int count, List<File> dir, Supplier<ClusterProvider> provider) { return createClusterEngines(count, dir, e -> {}, provider); } public static List<ClusterEngineWrapper> createClusterEngines(int count, Consumer<ClusterEngineWrapper> forEach, Supplier<ClusterProvider> provider) { return createClusterEngines(count, randomFiles(count), forEach, provider); } public static List<ClusterEngineWrapper> createClusterEngines(int count, List<File> dir, Consumer<ClusterEngineWrapper> forEach, Supplier<ClusterProvider> provider) { List<ClusterEngineWrapper> result = new ArrayList<>(); int[] ports = Utils.getFreePorts(count * 2); for (int i = 0, p = 0; i < count; i++, p += 2) { ClusterEngineWrapper engine = new ClusterEngineWrapper(dir.get(i), ClusterTestUtils.class.getClassLoader(), provider.get()); engine.setSequence(i); Address address = new InetAddress("127.0.0.1:" + ports[p], IOMode.ASYNC); engine.clusterConfiguration().currentNodeAddress(address); engine.clusterConfiguration().priorityInCluster(count - i); engine.clusterConfiguration().dataSync().port(ports[p + 1]); engine.clusterConfiguration().dataSync().mode(SyncMode.SNAPSHOT); forEach.accept(engine); result.add(engine); } for (ClusterEngineWrapper engine : result) { List<Address> nodes = result.stream() .filter(subEngine -> engine != subEngine) .map(ClusterEngineWrapper::getCurrentAddress) .collect(Collectors.toList()); engine.clusterConfiguration().nodesAddresses(nodes); } return result; } public static List<File> randomFiles(int count) { return Stream.generate(Files::createTempDir).limit(count).collect(Collectors.toList()); } }